home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 5 / Gekikoh Dennoh Club Vol. 5 (Japan).7z / Gekikoh Dennoh Club Vol. 5 (Japan) (Track 01).bin / internet / tcppack / tcppackb.lzh / src / libnetwork / arp.c next >
C/C++ Source or Header  |  1994-05-16  |  4KB  |  204 lines

  1. /*
  2.  * arp.c
  3.  *
  4.  * Copyright (C) 1994 First Class Technology.
  5.  */
  6.  
  7. #include<stdio.h>
  8. #include<stdlib.h>
  9. #include<string.h>
  10. #include<time.h>
  11.  
  12. #include"tcpipdrv.h"
  13. #include"network.h"
  14.  
  15. #define ARPSIZE 17
  16.  
  17. /* tcpipdrv é╠ arp.h é╠Ä└æòé╔ê╦æ╢ */
  18. typedef struct _arp_table
  19. {
  20.   struct _arp_table *prev;
  21.   struct _arp_table *next;
  22.  
  23.   long tmp1;
  24.   long tmp2;
  25.   int state;
  26.   long tmp3;
  27.   long tmp4;
  28.   long ip_addr;
  29.   int hw_addr_len;
  30.   char hw_addr[16];
  31. } _arp_table;
  32.  
  33. /*
  34.  *    LIFE
  35.  */
  36. #define ARPLIFE        (600)    /* Lifetime of a valid ARP entry: 10 minutes */
  37. #define    ARP_RESEND    (1)    /* resend if no reply in 1 sec */
  38. #define ARP_MAXRETRY    (4)
  39.  
  40. /*
  41.  *
  42.  */
  43. #define ARP_PENDING    (0)
  44. #define ARP_VALID    (1)
  45.  
  46. _ti_func search_ti_entry (void);
  47.  
  48. /************************************************
  49.  *                        *
  50.  ************************************************/
  51. char *
  52. search_arp_table (long ipaddr, int len, char *dst)
  53. {
  54.   _ti_func func = search_ti_entry ();
  55.   if (func)
  56.     {
  57.       _arp_table *cur;
  58.       cur = (_arp_table *)func (_TI_search_arp_table, (long*)ipaddr);
  59.       if (cur)
  60.     {
  61.       int bufsize;
  62.  
  63.       bufsize = cur->hw_addr_len * 2 + (cur->hw_addr_len - 1) + 1;
  64.       if (cur->state == ARP_VALID)
  65.         {
  66.           if (bufsize < len)
  67.         {
  68.           int i;
  69.           char *p;
  70.           char *q;
  71.  
  72.           p = dst;
  73.           q = cur->hw_addr;
  74.           for (i = 0; i < cur->hw_addr_len; i++)
  75.             {
  76.               sprintf (p, "%2.2x:", (unsigned char)*q++);
  77.               p += 3;
  78.             }
  79.           if (i)
  80.             *(p - 1) = '\0';
  81.           return dst;
  82.         }
  83.         }
  84.       else
  85.         {
  86.           if (len > 12)
  87.         {
  88.           strcpy (dst, "<incomplete>");
  89.           return dst;
  90.         }
  91.           
  92.         }
  93.     }
  94.     }
  95.   return NULL;
  96. }
  97.  
  98. /************************************************
  99.  *                        *
  100.  ************************************************/
  101. void
  102. delete_arp_table (long ipaddr)
  103. {
  104.   _ti_func func = search_ti_entry ();
  105.   if (func)
  106.     func (_TI_del_arp_table, (long*)ipaddr);
  107.  
  108.   return;
  109. }
  110.  
  111. /************************************************
  112.  *                        *
  113.  ************************************************/
  114. void
  115. add_arp_table (long ipaddr, char *src)
  116. {
  117.   _ti_func func = search_ti_entry ();
  118.   if (func)
  119.     {
  120.       long arg[2];
  121.  
  122.       arg[0] = ipaddr;
  123.       arg[1] = (long)src;
  124.       func (_TI_add_arp_table, arg);
  125.     }
  126.  
  127.   return;
  128. }
  129.  
  130. /************************************************
  131.  *                        *
  132.  ************************************************/
  133. char *
  134. chkhost (long target, int len, char *buff)
  135. {
  136.   clock_t start, now;
  137.   _ti_func func = search_ti_entry ();
  138.  
  139.   delete_arp_table (target);
  140.   if (func)
  141.     {
  142.       now = start = clock ();
  143.       /* request */
  144.       func (_TI_arp_request, (long *)target);
  145.  
  146.       while ((now - start) / CLOCKS_PER_SEC < ARP_RESEND * (ARP_MAXRETRY))
  147.     {
  148.       search_arp_table (target, len, buff);
  149.       if (strcmp (buff, "<incomplete>"))
  150.         {
  151.           return buff;
  152.         }
  153.       now = clock ();
  154.     }
  155.     }
  156.   return NULL;
  157. }
  158.  
  159. /************************************************
  160.  *                        *
  161.  ************************************************/
  162. long *
  163. get_arp_array (int *len)
  164. {
  165.   _ti_func func = search_ti_entry ();
  166.   _arp_table **_top, *_cur;
  167.   long *array;
  168.   int n, nn;
  169.   int x;
  170.  
  171.   *len = 0;
  172.   array = NULL;
  173.   if (func)
  174.     {
  175.       _top = (_arp_table **)func (_TI_get_arp_table_top, NULL);
  176.  
  177.       n = 0;
  178.       for (x = 0; x < ARPSIZE; x++)
  179.     {
  180.       for (_cur = _top[x]; _cur != NULL; _cur = _cur->next)
  181.         n++;
  182.     }
  183.  
  184.       if (n)
  185.     {
  186.       array = (long *)malloc (sizeof (long) * n);
  187.       nn = 0;
  188.       for (x = 0; x < ARPSIZE; x++)
  189.         {
  190.           for (_cur = _top[x]; nn < n && _cur != NULL; nn++, _cur = _cur->next)
  191.         array[nn] = _cur->ip_addr;
  192.         }
  193.       *len = nn;
  194.       if (!nn)
  195.         {
  196.           free (array);
  197.           array = NULL;
  198.         }
  199.     }
  200.     }
  201.  
  202.   return array;
  203. }
  204.